package xm.util
{

	/**
	 * @author winnie
	 */	
	public class XmlParsingUtil
	{
		
		
		/**
		 * @param __data 결과 xml 원본
		 * @param __nodeName 검색할 노드명
		 * @param __isTrim 좌우 공백을 없앰
		 * @return 배열로 반환
		 */		
		public static function getListFromResultData( __data:Object, __nodeName : String, __isTrim : Boolean = false ):Array
		{
			
			var __list : Array = [];
			
			// 우선 노트 명에 맞는 xml 을 가져오고
			var xmlData : XMLList = XMLList(getElementList( __data , __nodeName ));
			
			// item의 length 만큼  for문을 돌면서
			for each( var item:XML in xmlData )
			{
				var obj : Object = {};
				// item[n]번째의 노드명과, 노드값을 각각 오브젝트에 담아 배열에 다시 넣는다.
				for each( var dataItem:XML in item.children() )
				{
					obj[ dataItem.localName() ] = dataItem.toString();
					
					if( __isTrim )
					{
						obj[ dataItem.localName() ] = StringUtils.trimLeft( StringUtils.trimRight( obj[ dataItem.localName() ] ) );
					}
				}
				
				__list.push( obj );
			}
			
			return __list;
		}
		
		
		
		/**
		 * @param __data 결과 xml 원본
		 * @param __nodeName 검색할 노드명
		 * @param __isTrim 좌우 공백을 없앰
		 * @return object 로 반환
		 */		
		public static function getObjFromResultData( __data:Object, __nodeName : String, __isTrim : Boolean = false ):Object
		{
			var obj : Object = {};
			
			// 우선 노트 명에 맞는 xml 을 가져오고
			var xmlData : XMLList = XMLList(getElementList( __data, __nodeName ));
			
			// item[n]번째의 노드명과, 노드값을 각각 오브젝트에 담아 배열에 다시 넣는다.
			for each( var dataItem:XML in xmlData.children() )
			{
				obj[ dataItem.localName() ] = dataItem.toString();
				
				if( __isTrim )
				{
					obj[ dataItem.localName() ] = StringUtils.trimLeft( StringUtils.trimRight( obj[ dataItem.localName() ] ) );
				}
			}
			
			
			var i : int = 0;
			var tempData : String = "";
			for each( var objData : String in obj )
			{
				i++;
				tempData = objData;
			}
			
			// 만약 object 의 자식이 1개뿐이라면 바로 데이터 반환 
			return ( i == 1 ) ? tempData : obj;
		}
		
		
		/**
		 * @param __data : 최초 xml 데이타
		 * @param __compareNodeName : 비교하고자하는 노드 풀 네임. ( list.item.NUM )
		 * @param __compareValue : 비교하고자 하는 노드 값
		 * @param __returnNodeName : 리턴받고자 하는 노드 풀네임. ( list.item )
		 * @return Object 
		 */		
		public static function findItemAndGetObj( __data:Object , __compareNodeName:String, __compareValue : String,  __returnNodeName:String = ""  ):Object
		{
			var findXMLList : XMLList;
			var resultXml : XMLList = XMLList(getElementList( __data, __compareNodeName ));
			var len : int = resultXml.length();
			for( var i:int = 0; i<len; i++ )
			{
				if( resultXml[i] == __compareValue )
				{
					findXMLList = XMLList( getElementList( __data, __returnNodeName )[i] );
				}
			}
			
			return getObjFromResultData( findXMLList, "" );
			
		}
		
		
		
		/**
		 * @param __data : 최초 xml 데이타
		 * @param __compareNodeName : 비교하고자하는 노드 풀 네임. ( list.item.NUM )
		 * @param __compareValue : 비교하고자 하는 노드 값
		 * @param __returnNodeName : 리턴받고자 하는 노드 풀네임. ( list.item )
		 * @return Array 
		 */		
		public static function findItemAndGetList( __data:Object , __compareNodeName:String, __compareValue : String,  __returnNodeName:String = ""  ):Array
		{
			var findList : Array = [];
			var resultXml : XMLList = XMLList(getElementList( __data, __compareNodeName ));
			var len : int = resultXml.length();
			for( var i:int = 0; i<len; i++ )
			{
				if( resultXml[i] == __compareValue )
				{
					findList.push( getObjFromResultData( XMLList( getElementList( __data, __returnNodeName )[i] ), "" ) )
				}
			}
			
			return findList;
		}
		
		
		
		private static function getElementList( __data:Object , __nodeName:String ):Object
		{
			if( __nodeName == "" ) return __data;
			
			var nodeList : Array = __nodeName.split(".");
			var obj : Object = __data;
			for each( var key:String in nodeList )
			{
				obj = obj.elements(key);
			}
			
			return obj;
		}
		
	}
}